import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

/**
 * @Author Jeff
 * @Time: 2019/8/20  19:10
 * 限流测试1  通过JUC工具类 Semaphore(信号量）  JUC J代表java，U代表util,C代表concurrent
 * <p>
 * 8个华为Mate20，100万人抢购，同时发起请求。先到达的8个请求，会被执行。
 * 剩下的92个请求相应会被拒绝。
 * 并发控制数在8个，超过一律请求拒绝
 */
public class CurrentLimitingTest1 {

    //许可数 8
    static Semaphore semaphore = new Semaphore(8);


    public static void main(String[] args) {

        for (int i = 0; i < 20; i++) {
            new Thread(() -> {
                boolean flag = false;
                try {
                    // tryAcquire(long time out,TimeUnit unit) unit表示timeout的单位
                    // 尝试在指定时间获取一个许可证，获取成功返回true,
                    // 指定的时间过后（timeout）还是无法获取许可证返回false
                    flag = semaphore.tryAcquire(100, TimeUnit.MICROSECONDS);
                    if (flag) {
                        System.out.println(Thread.currentThread() + "，尝试下单中..");
                    //    休眠2秒。模拟下单操作  //    下面那句和这句差不多    Thread.sleep(2000);
                        TimeUnit.SECONDS.sleep(2);
                    } else {
                        System.out.println(Thread.currentThread() + "，秒杀失败请稍微重试");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    //释放许可证，将其返回信号量
                    if (flag) {
                        semaphore.release();
                    }

                }
            }).start();
        }
//下面注释是不用lambda表达式完成

//        //显示20个请求结果
//        for (int i = 0; i < 20; i++) {
//            new Thread(new Runnable() {
//                public void run() {
//                    boolean flag = false;
//                    try {
//                        flag = semaphore.tryAcquire(100, TimeUnit.MICROSECONDS);
//                        if (flag) {
//
//                            System.out.println(Thread.currentThread().getName() + "，尝试下单中..");
//                            //休眠2秒。模拟下单操作  Thread.sleep(2000);
//                            TimeUnit.SECONDS.sleep(2);
//                        } else {
//                            System.out.println(Thread.currentThread().getName() + "，秒杀失败请稍微重试");
//                        }
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    } finally {
//                        //释放许可证，将其返回信号量
//                        if(flag){
//                            semaphore.release();
//                        }
//                    }
//                }
//            }).start();
//        }

    }
}
